home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1994 November: Tool Chest / Dev.CD Nov 94.toast / Sample Code / Snippets / Devices / Serial Driver Arbitration / SerialDriverArbitration.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-10-07  |  2.5 KB  |  115 lines  |  [TEXT/KAHL]

  1. #include <GestaltEqu.h>
  2. #include <SysEqu.h>
  3. #include <Devices.h>
  4.  
  5. #include <stdio.h>
  6.  
  7. #define gestaltArbitorAttr                 'arb '
  8. #define gestaltSerialArbitrationExists    0
  9. #define dRAMBased        0x0040
  10. #define dOpened            0x0020
  11.  
  12. Boolean SerialArbitrationExists(void)
  13. {
  14.     long    response;
  15.     OSErr    err;
  16.     
  17.     err = Gestalt(gestaltArbitorAttr, &response);
  18.     if (err)
  19.         return false;
  20.     return ((response >> gestaltSerialArbitrationExists) & 1);
  21. }
  22.  
  23.  
  24. Boolean DriverIsOpen(StringPtr driverName)
  25. {
  26.     Boolean canOpen = false;
  27.     Boolean match = false;
  28.     short    index = 0;
  29.     short    count;
  30.     DCtlHandle    dceHandle;
  31.     StringPtr    namePtr;
  32.     DCtlHandle    *theUnitTable;
  33.     
  34.     // this is the low memory global containing the number of entries 
  35.     // in the Unit Table
  36.     count = *(short *)UnitNtryCnt;
  37.     
  38.     theUnitTable = *(DCtlHandle **)UTableBase;
  39.     
  40.     while ( !match && (index < count)) {
  41.         // get handle to a device control entry
  42.         dceHandle = theUnitTable[index];
  43.         
  44.         if (dceHandle) {
  45.             if (!( (**dceHandle).dCtlFlags & dRAMBased) )
  46.                 // RAM based drivers have a handle to their driver
  47.                 namePtr = (StringPtr)(**dceHandle).dCtlDriver+18;
  48.             else
  49.                 // ROM based drivers have a pointer to their driver
  50.                 namePtr = (StringPtr) (*(DCtlPtr)dceHandle).dCtlDriver+18;
  51.  
  52.             // not case sensitive, diacritical marks count
  53.             if (RelString(driverName, namePtr, false, true) == 0) {
  54.                 match = true;
  55.                 canOpen = ((**dceHandle).dCtlFlags & dOpened) ? true : false;
  56.             }
  57.         }
  58.         index++;
  59.     }
  60.     return canOpen;
  61. }
  62.  
  63. Boolean CRMInstalled(void)
  64. {
  65.     long    response;
  66.     OSErr    err;
  67.     
  68.     err = Gestalt(gestaltCRMAttr, &response);
  69.     if (err)
  70.         return false;
  71.     return ((response >> gestaltCRMPresent) & 1);
  72. }
  73.  
  74. Str255    gDriverNames[] = {"\p.NoDrvr", 
  75.                           "\p.AOut", 
  76.                           "\p.BIn", 
  77.                           "\p.BOut",
  78.                           "\p.AppleCD",
  79.                           "\p.MPP",
  80.                           "\p.ASYC00",
  81.                           "\p.AIn"
  82.                          };
  83.  
  84. #define TEST_CALL
  85. main()
  86. {
  87.     OSErr    err = noErr;
  88.     short    i;
  89.     short    numDrivers;
  90.     
  91.     printf("Test of serial port stuff\n");
  92.     if (CRMInstalled())
  93.         printf("Communication Resource Manager is installed.\n");
  94.     if (SerialArbitrationExists())
  95.         printf("Serial Arbitration exists\n");
  96.         
  97. #ifdef TEST_CALL
  98.     numDrivers = sizeof(gDriverNames) / sizeof(Str255);
  99.     for (i = 0; i < numDrivers; i++)
  100.         printf("DriverIsOpen(%#s)\treturned %s\n", 
  101.                 gDriverNames[i], DriverIsOpen(gDriverNames[i])?"True ":"False");
  102. #endif
  103.  
  104. #ifdef TEST_OPEN
  105.     short    refNum;
  106.  
  107.     if (!DriverIsOpen("\p.AIn"))
  108.         err = OpenDriver("\p.AIn", &refNum);
  109.     if (err)
  110.         printf("OpenDriver returned %d\n", err);
  111.     err = CloseDriver(refNum);
  112.     if (err)
  113.         printf("CloseDriver returned %d\n", err);
  114. #endif
  115. }